package edu.uic.cs.t_verifier.process.words;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Locale;

import org.apache.commons.lang.StringUtils;

public class StopWords
{
	private static final HashSet<String> STOP_WORDS = new HashSet<String>();

	static
	{

		STOP_WORDS.addAll(Arrays.asList("a", "an", "and", "are", "as", "at",
				"be", "but", "by", "for", "if", "in", "into", "is", "it", "no",
				"not", "of", "on", "or", "such", "that", "the", "their",
				"then", "there", "these", "they", "this", "to", "was", "will",
				"with"));

		//		//Stopwords list from Rainbow
		//		STOP_WORDS.add("a");
		//		STOP_WORDS.add("able");
		//		STOP_WORDS.add("about");
		//		STOP_WORDS.add("above");
		//		STOP_WORDS.add("according");
		//		STOP_WORDS.add("accordingly");
		//		STOP_WORDS.add("across");
		//		STOP_WORDS.add("actually");
		//		STOP_WORDS.add("after");
		//		STOP_WORDS.add("afterwards");
		//		STOP_WORDS.add("again");
		//		STOP_WORDS.add("against");
		//		STOP_WORDS.add("all");
		//		STOP_WORDS.add("allow");
		//		STOP_WORDS.add("allows");
		//		STOP_WORDS.add("almost");
		//		STOP_WORDS.add("alone");
		//		STOP_WORDS.add("along");
		//		STOP_WORDS.add("already");
		//		STOP_WORDS.add("also");
		//		STOP_WORDS.add("although");
		//		STOP_WORDS.add("always");
		//		STOP_WORDS.add("am");
		//		STOP_WORDS.add("among");
		//		STOP_WORDS.add("amongst");
		//		STOP_WORDS.add("an");
		//		STOP_WORDS.add("and");
		//		STOP_WORDS.add("another");
		//		STOP_WORDS.add("any");
		//		STOP_WORDS.add("anybody");
		//		STOP_WORDS.add("anyhow");
		//		STOP_WORDS.add("anyone");
		//		STOP_WORDS.add("anything");
		//		STOP_WORDS.add("anyway");
		//		STOP_WORDS.add("anyways");
		//		STOP_WORDS.add("anywhere");
		//		STOP_WORDS.add("apart");
		//		STOP_WORDS.add("appear");
		//		STOP_WORDS.add("appreciate");
		//		STOP_WORDS.add("appropriate");
		//		STOP_WORDS.add("are");
		//		STOP_WORDS.add("around");
		//		STOP_WORDS.add("as");
		//		STOP_WORDS.add("aside");
		//		STOP_WORDS.add("ask");
		//		STOP_WORDS.add("asking");
		//		STOP_WORDS.add("associated");
		//		STOP_WORDS.add("at");
		//		STOP_WORDS.add("available");
		//		STOP_WORDS.add("away");
		//		STOP_WORDS.add("awfully");
		//		STOP_WORDS.add("b");
		//		STOP_WORDS.add("be");
		//		STOP_WORDS.add("became");
		//		STOP_WORDS.add("because");
		//		STOP_WORDS.add("become");
		//		STOP_WORDS.add("becomes");
		//		STOP_WORDS.add("becoming");
		//		STOP_WORDS.add("been");
		//		STOP_WORDS.add("before");
		//		STOP_WORDS.add("beforehand");
		//		STOP_WORDS.add("behind");
		//		STOP_WORDS.add("being");
		//		STOP_WORDS.add("believe");
		//		STOP_WORDS.add("below");
		//		STOP_WORDS.add("beside");
		//		STOP_WORDS.add("besides");
		//		STOP_WORDS.add("best");
		//		STOP_WORDS.add("better");
		//		STOP_WORDS.add("between");
		//		STOP_WORDS.add("beyond");
		//		STOP_WORDS.add("both");
		//		STOP_WORDS.add("brief");
		//		STOP_WORDS.add("but");
		//		STOP_WORDS.add("by");
		//		STOP_WORDS.add("c");
		//		STOP_WORDS.add("came");
		//		STOP_WORDS.add("can");
		//		STOP_WORDS.add("cannot");
		//		STOP_WORDS.add("cant");
		//		STOP_WORDS.add("cause");
		//		STOP_WORDS.add("causes");
		//		STOP_WORDS.add("certain");
		//		STOP_WORDS.add("certainly");
		//		STOP_WORDS.add("changes");
		//		STOP_WORDS.add("clearly");
		//		STOP_WORDS.add("co");
		//		STOP_WORDS.add("com");
		//		STOP_WORDS.add("come");
		//		STOP_WORDS.add("comes");
		//		STOP_WORDS.add("concerning");
		//		STOP_WORDS.add("consequently");
		//		STOP_WORDS.add("consider");
		//		STOP_WORDS.add("considering");
		//		STOP_WORDS.add("contain");
		//		STOP_WORDS.add("containing");
		//		STOP_WORDS.add("contains");
		//		STOP_WORDS.add("corresponding");
		//		STOP_WORDS.add("could");
		//		STOP_WORDS.add("course");
		//		STOP_WORDS.add("currently");
		//		STOP_WORDS.add("d");
		//		STOP_WORDS.add("definitely");
		//		STOP_WORDS.add("described");
		//		STOP_WORDS.add("despite");
		//		STOP_WORDS.add("did");
		//		STOP_WORDS.add("different");
		//		STOP_WORDS.add("do");
		//		STOP_WORDS.add("does");
		//		STOP_WORDS.add("doing");
		//		STOP_WORDS.add("done");
		//		STOP_WORDS.add("down");
		//		STOP_WORDS.add("downwards");
		//		STOP_WORDS.add("during");
		//		STOP_WORDS.add("e");
		//		STOP_WORDS.add("each");
		//		STOP_WORDS.add("edu");
		//		STOP_WORDS.add("eg");
		//		//		STOP_WORDS.add("eight");
		//		STOP_WORDS.add("either");
		//		STOP_WORDS.add("else");
		//		STOP_WORDS.add("elsewhere");
		//		STOP_WORDS.add("enough");
		//		STOP_WORDS.add("entirely");
		//		STOP_WORDS.add("especially");
		//		STOP_WORDS.add("et");
		//		STOP_WORDS.add("etc");
		//		STOP_WORDS.add("even");
		//		STOP_WORDS.add("ever");
		//		STOP_WORDS.add("every");
		//		STOP_WORDS.add("everybody");
		//		STOP_WORDS.add("everyone");
		//		STOP_WORDS.add("everything");
		//		STOP_WORDS.add("everywhere");
		//		STOP_WORDS.add("ex");
		//		STOP_WORDS.add("exactly");
		//		STOP_WORDS.add("example");
		//		STOP_WORDS.add("except");
		//		STOP_WORDS.add("f");
		//		STOP_WORDS.add("far");
		//		STOP_WORDS.add("few");
		//		STOP_WORDS.add("fifth");
		//		STOP_WORDS.add("first");
		//		//		STOP_WORDS.add("five");
		//		STOP_WORDS.add("followed");
		//		STOP_WORDS.add("following");
		//		STOP_WORDS.add("follows");
		//		STOP_WORDS.add("for");
		//		STOP_WORDS.add("former");
		//		STOP_WORDS.add("formerly");
		//		STOP_WORDS.add("forth");
		//		//		STOP_WORDS.add("four");
		//		STOP_WORDS.add("from");
		//		STOP_WORDS.add("further");
		//		STOP_WORDS.add("furthermore");
		//		STOP_WORDS.add("g");
		//		STOP_WORDS.add("get");
		//		STOP_WORDS.add("gets");
		//		STOP_WORDS.add("getting");
		//		STOP_WORDS.add("given");
		//		STOP_WORDS.add("gives");
		//		STOP_WORDS.add("go");
		//		STOP_WORDS.add("goes");
		//		STOP_WORDS.add("going");
		//		STOP_WORDS.add("gone");
		//		STOP_WORDS.add("got");
		//		STOP_WORDS.add("gotten");
		//		STOP_WORDS.add("greetings");
		//		STOP_WORDS.add("h");
		//		STOP_WORDS.add("had");
		//		STOP_WORDS.add("happens");
		//		STOP_WORDS.add("hardly");
		//		STOP_WORDS.add("has");
		//		STOP_WORDS.add("have");
		//		STOP_WORDS.add("having");
		//		STOP_WORDS.add("he");
		//		STOP_WORDS.add("hello");
		//		STOP_WORDS.add("help");
		//		STOP_WORDS.add("hence");
		//		STOP_WORDS.add("her");
		//		STOP_WORDS.add("here");
		//		STOP_WORDS.add("hereafter");
		//		STOP_WORDS.add("hereby");
		//		STOP_WORDS.add("herein");
		//		STOP_WORDS.add("hereupon");
		//		STOP_WORDS.add("hers");
		//		STOP_WORDS.add("herself");
		//		STOP_WORDS.add("hi");
		//		STOP_WORDS.add("him");
		//		STOP_WORDS.add("himself");
		//		STOP_WORDS.add("his");
		//		STOP_WORDS.add("hither");
		//		STOP_WORDS.add("hopefully");
		//		STOP_WORDS.add("how");
		//		STOP_WORDS.add("howbeit");
		//		STOP_WORDS.add("however");
		//		STOP_WORDS.add("i");
		//		STOP_WORDS.add("ie");
		//		STOP_WORDS.add("if");
		//		STOP_WORDS.add("ignored");
		//		STOP_WORDS.add("immediate");
		//		STOP_WORDS.add("in");
		//		STOP_WORDS.add("inasmuch");
		//		STOP_WORDS.add("inc");
		//		STOP_WORDS.add("indeed");
		//		STOP_WORDS.add("indicate");
		//		STOP_WORDS.add("indicated");
		//		STOP_WORDS.add("indicates");
		//		STOP_WORDS.add("inner");
		//		STOP_WORDS.add("insofar");
		//		STOP_WORDS.add("instead");
		//		STOP_WORDS.add("into");
		//		STOP_WORDS.add("inward");
		//		STOP_WORDS.add("is");
		//		STOP_WORDS.add("it");
		//		STOP_WORDS.add("its");
		//		STOP_WORDS.add("itself");
		//		STOP_WORDS.add("j");
		//		STOP_WORDS.add("just");
		//		STOP_WORDS.add("k");
		//		STOP_WORDS.add("keep");
		//		STOP_WORDS.add("keeps");
		//		STOP_WORDS.add("kept");
		//		STOP_WORDS.add("know");
		//		STOP_WORDS.add("knows");
		//		STOP_WORDS.add("known");
		//		STOP_WORDS.add("l");
		//		STOP_WORDS.add("last");
		//		STOP_WORDS.add("lately");
		//		STOP_WORDS.add("later");
		//		STOP_WORDS.add("latter");
		//		STOP_WORDS.add("latterly");
		//		STOP_WORDS.add("least");
		//		STOP_WORDS.add("less");
		//		STOP_WORDS.add("lest");
		//		STOP_WORDS.add("let");
		//		STOP_WORDS.add("like");
		//		STOP_WORDS.add("liked");
		//		STOP_WORDS.add("likely");
		//		STOP_WORDS.add("little");
		//		STOP_WORDS.add("ll"); //added to avoid words like you'll,I'll etc.
		//		STOP_WORDS.add("look");
		//		STOP_WORDS.add("looking");
		//		STOP_WORDS.add("looks");
		//		STOP_WORDS.add("ltd");
		//		STOP_WORDS.add("m");
		//		STOP_WORDS.add("mainly");
		//		STOP_WORDS.add("many");
		//		STOP_WORDS.add("may");
		//		STOP_WORDS.add("maybe");
		//		STOP_WORDS.add("me");
		//		STOP_WORDS.add("mean");
		//		STOP_WORDS.add("meanwhile");
		//		STOP_WORDS.add("merely");
		//		STOP_WORDS.add("might");
		//		STOP_WORDS.add("more");
		//		STOP_WORDS.add("moreover");
		//		STOP_WORDS.add("most");
		//		STOP_WORDS.add("mostly");
		//		STOP_WORDS.add("much");
		//		STOP_WORDS.add("must");
		//		STOP_WORDS.add("my");
		//		STOP_WORDS.add("myself");
		//		STOP_WORDS.add("n");
		//		STOP_WORDS.add("name");
		//		STOP_WORDS.add("namely");
		//		STOP_WORDS.add("nd");
		//		STOP_WORDS.add("near");
		//		STOP_WORDS.add("nearly");
		//		STOP_WORDS.add("necessary");
		//		STOP_WORDS.add("need");
		//		STOP_WORDS.add("needs");
		//		STOP_WORDS.add("neither");
		//		STOP_WORDS.add("never");
		//		STOP_WORDS.add("nevertheless");
		//		STOP_WORDS.add("new");
		//		STOP_WORDS.add("next");
		//		//		STOP_WORDS.add("nine");
		//		STOP_WORDS.add("no");
		//		STOP_WORDS.add("nobody");
		//		STOP_WORDS.add("non");
		//		STOP_WORDS.add("none");
		//		STOP_WORDS.add("noone");
		//		STOP_WORDS.add("nor");
		//		STOP_WORDS.add("normally");
		//		STOP_WORDS.add("not");
		//		STOP_WORDS.add("nothing");
		//		STOP_WORDS.add("novel");
		//		STOP_WORDS.add("now");
		//		STOP_WORDS.add("nowhere");
		//		STOP_WORDS.add("o");
		//		STOP_WORDS.add("obviously");
		//		STOP_WORDS.add("of");
		//		STOP_WORDS.add("off");
		//		STOP_WORDS.add("often");
		//		STOP_WORDS.add("oh");
		//		STOP_WORDS.add("ok");
		//		STOP_WORDS.add("okay");
		//		STOP_WORDS.add("old");
		//		STOP_WORDS.add("on");
		//		STOP_WORDS.add("once");
		//		//		STOP_WORDS.add("one");
		//		STOP_WORDS.add("ones");
		//		STOP_WORDS.add("only");
		//		STOP_WORDS.add("onto");
		//		STOP_WORDS.add("or");
		//		STOP_WORDS.add("other");
		//		STOP_WORDS.add("others");
		//		STOP_WORDS.add("otherwise");
		//		STOP_WORDS.add("ought");
		//		STOP_WORDS.add("our");
		//		STOP_WORDS.add("ours");
		//		STOP_WORDS.add("ourselves");
		//		STOP_WORDS.add("out");
		//		STOP_WORDS.add("outside");
		//		STOP_WORDS.add("over");
		//		STOP_WORDS.add("overall");
		//		STOP_WORDS.add("own");
		//		STOP_WORDS.add("p");
		//		STOP_WORDS.add("particular");
		//		STOP_WORDS.add("particularly");
		//		STOP_WORDS.add("per");
		//		STOP_WORDS.add("perhaps");
		//		STOP_WORDS.add("placed");
		//		STOP_WORDS.add("please");
		//		STOP_WORDS.add("plus");
		//		STOP_WORDS.add("possible");
		//		STOP_WORDS.add("presumably");
		//		STOP_WORDS.add("probably");
		//		STOP_WORDS.add("provides");
		//		STOP_WORDS.add("q");
		//		STOP_WORDS.add("que");
		//		STOP_WORDS.add("quite");
		//		STOP_WORDS.add("qv");
		//		STOP_WORDS.add("r");
		//		STOP_WORDS.add("rather");
		//		STOP_WORDS.add("rd");
		//		STOP_WORDS.add("re");
		//		STOP_WORDS.add("really");
		//		STOP_WORDS.add("reasonably");
		//		STOP_WORDS.add("regarding");
		//		STOP_WORDS.add("regardless");
		//		STOP_WORDS.add("regards");
		//		STOP_WORDS.add("relatively");
		//		STOP_WORDS.add("respectively");
		//		STOP_WORDS.add("right");
		//		STOP_WORDS.add("s");
		//		STOP_WORDS.add("said");
		//		STOP_WORDS.add("same");
		//		STOP_WORDS.add("saw");
		//		STOP_WORDS.add("say");
		//		STOP_WORDS.add("saying");
		//		STOP_WORDS.add("says");
		//		STOP_WORDS.add("second");
		//		STOP_WORDS.add("secondly");
		//		STOP_WORDS.add("see");
		//		STOP_WORDS.add("seeing");
		//		STOP_WORDS.add("seem");
		//		STOP_WORDS.add("seemed");
		//		STOP_WORDS.add("seeming");
		//		STOP_WORDS.add("seems");
		//		STOP_WORDS.add("seen");
		//		STOP_WORDS.add("self");
		//		STOP_WORDS.add("selves");
		//		STOP_WORDS.add("sensible");
		//		STOP_WORDS.add("sent");
		//		STOP_WORDS.add("serious");
		//		STOP_WORDS.add("seriously");
		//		//		STOP_WORDS.add("seven");
		//		STOP_WORDS.add("several");
		//		STOP_WORDS.add("shall");
		//		STOP_WORDS.add("she");
		//		STOP_WORDS.add("should");
		//		STOP_WORDS.add("since");
		//		//		STOP_WORDS.add("six");
		//		STOP_WORDS.add("so");
		//		STOP_WORDS.add("some");
		//		STOP_WORDS.add("somebody");
		//		STOP_WORDS.add("somehow");
		//		STOP_WORDS.add("someone");
		//		STOP_WORDS.add("something");
		//		STOP_WORDS.add("sometime");
		//		STOP_WORDS.add("sometimes");
		//		STOP_WORDS.add("somewhat");
		//		STOP_WORDS.add("somewhere");
		//		STOP_WORDS.add("soon");
		//		STOP_WORDS.add("sorry");
		//		STOP_WORDS.add("specified");
		//		STOP_WORDS.add("specify");
		//		STOP_WORDS.add("specifying");
		//		STOP_WORDS.add("still");
		//		STOP_WORDS.add("sub");
		//		STOP_WORDS.add("such");
		//		STOP_WORDS.add("sup");
		//		STOP_WORDS.add("sure");
		//		STOP_WORDS.add("t");
		//		STOP_WORDS.add("take");
		//		STOP_WORDS.add("taken");
		//		STOP_WORDS.add("tell");
		//		STOP_WORDS.add("tends");
		//		STOP_WORDS.add("th");
		//		STOP_WORDS.add("than");
		//		STOP_WORDS.add("thank");
		//		STOP_WORDS.add("thanks");
		//		STOP_WORDS.add("thanx");
		//		STOP_WORDS.add("that");
		//		STOP_WORDS.add("thats");
		//		STOP_WORDS.add("the");
		//		STOP_WORDS.add("their");
		//		STOP_WORDS.add("theirs");
		//		STOP_WORDS.add("them");
		//		STOP_WORDS.add("themselves");
		//		STOP_WORDS.add("then");
		//		STOP_WORDS.add("thence");
		//		STOP_WORDS.add("there");
		//		STOP_WORDS.add("thereafter");
		//		STOP_WORDS.add("thereby");
		//		STOP_WORDS.add("therefore");
		//		STOP_WORDS.add("therein");
		//		STOP_WORDS.add("theres");
		//		STOP_WORDS.add("thereupon");
		//		STOP_WORDS.add("these");
		//		STOP_WORDS.add("they");
		//		STOP_WORDS.add("think");
		//		STOP_WORDS.add("third");
		//		STOP_WORDS.add("this");
		//		STOP_WORDS.add("thorough");
		//		STOP_WORDS.add("thoroughly");
		//		STOP_WORDS.add("those");
		//		STOP_WORDS.add("though");
		//		//		STOP_WORDS.add("three");
		//		STOP_WORDS.add("through");
		//		STOP_WORDS.add("throughout");
		//		STOP_WORDS.add("thru");
		//		STOP_WORDS.add("thus");
		//		STOP_WORDS.add("to");
		//		STOP_WORDS.add("together");
		//		STOP_WORDS.add("too");
		//		STOP_WORDS.add("took");
		//		STOP_WORDS.add("toward");
		//		STOP_WORDS.add("towards");
		//		STOP_WORDS.add("tried");
		//		STOP_WORDS.add("tries");
		//		STOP_WORDS.add("truly");
		//		STOP_WORDS.add("try");
		//		STOP_WORDS.add("trying");
		//		STOP_WORDS.add("twice");
		//		//		STOP_WORDS.add("two");
		//		STOP_WORDS.add("u");
		//		STOP_WORDS.add("un");
		//		STOP_WORDS.add("under");
		//		STOP_WORDS.add("unfortunately");
		//		STOP_WORDS.add("unless");
		//		STOP_WORDS.add("unlikely");
		//		STOP_WORDS.add("until");
		//		STOP_WORDS.add("unto");
		//		STOP_WORDS.add("up");
		//		STOP_WORDS.add("upon");
		//		STOP_WORDS.add("us");
		//		STOP_WORDS.add("use");
		//		STOP_WORDS.add("used");
		//		STOP_WORDS.add("useful");
		//		STOP_WORDS.add("uses");
		//		STOP_WORDS.add("using");
		//		STOP_WORDS.add("usually");
		//		STOP_WORDS.add("uucp");
		//		STOP_WORDS.add("v");
		//		STOP_WORDS.add("value");
		//		STOP_WORDS.add("various");
		//		STOP_WORDS.add("ve"); //added to avoid words like I've,you've etc.
		//		STOP_WORDS.add("very");
		//		STOP_WORDS.add("via");
		//		STOP_WORDS.add("viz");
		//		STOP_WORDS.add("vs");
		//		STOP_WORDS.add("w");
		//		STOP_WORDS.add("want");
		//		STOP_WORDS.add("wants");
		//		STOP_WORDS.add("was");
		//		STOP_WORDS.add("way");
		//		STOP_WORDS.add("we");
		//		STOP_WORDS.add("welcome");
		//		STOP_WORDS.add("well");
		//		STOP_WORDS.add("went");
		//		STOP_WORDS.add("were");
		//		STOP_WORDS.add("what");
		//		STOP_WORDS.add("whatever");
		//		STOP_WORDS.add("when");
		//		STOP_WORDS.add("whence");
		//		STOP_WORDS.add("whenever");
		//		STOP_WORDS.add("where");
		//		STOP_WORDS.add("whereafter");
		//		STOP_WORDS.add("whereas");
		//		STOP_WORDS.add("whereby");
		//		STOP_WORDS.add("wherein");
		//		STOP_WORDS.add("whereupon");
		//		STOP_WORDS.add("wherever");
		//		STOP_WORDS.add("whether");
		//		STOP_WORDS.add("which");
		//		STOP_WORDS.add("while");
		//		STOP_WORDS.add("whither");
		//		STOP_WORDS.add("who");
		//		STOP_WORDS.add("whoever");
		//		STOP_WORDS.add("whole");
		//		STOP_WORDS.add("whom");
		//		STOP_WORDS.add("whose");
		//		STOP_WORDS.add("why");
		//		STOP_WORDS.add("will");
		//		STOP_WORDS.add("willing");
		//		STOP_WORDS.add("wish");
		//		STOP_WORDS.add("with");
		//		STOP_WORDS.add("within");
		//		STOP_WORDS.add("without");
		//		STOP_WORDS.add("wonder");
		//		STOP_WORDS.add("would");
		//		STOP_WORDS.add("would");
		//		STOP_WORDS.add("x");
		//		STOP_WORDS.add("y");
		//		STOP_WORDS.add("yes");
		//		STOP_WORDS.add("yet");
		//		STOP_WORDS.add("you");
		//		STOP_WORDS.add("your");
		//		STOP_WORDS.add("yours");
		//		STOP_WORDS.add("yourself");
		//		STOP_WORDS.add("yourselves");
		//		STOP_WORDS.add("z");
		//		STOP_WORDS.add("zero");
	}

	private StopWords()
	{
	}

	public static boolean isStopWord(String word)
	{
		word = word.trim().toLowerCase(Locale.US);
		return STOP_WORDS.contains(word);
	}

	public static String trimStopWordsInBothSides(String topicUnit)
	{
		String[] words = StringUtils.split(topicUnit);
		int firstNonStopWordIndex = words.length;
		int lastNonStopWordIndex = -1;
		for (int index = 0; index < words.length; index++)
		{
			String word = words[index];
			if (!isStopWord(word))
			{
				firstNonStopWordIndex = index;
				break;
			}
		}

		for (int index = words.length - 1; index >= 0; index--)
		{
			String word = words[index];
			if (!isStopWord(word))
			{
				lastNonStopWordIndex = index;
				break;
			}
		}

		StringBuilder stringBuilder = new StringBuilder();
		if (lastNonStopWordIndex >= 0)
		{
			for (int index = firstNonStopWordIndex; index < lastNonStopWordIndex; index++)
			{
				stringBuilder.append(words[index]);
				stringBuilder.append(' ');
			}
			stringBuilder.append(words[lastNonStopWordIndex]);
		}

		return stringBuilder.toString();
	}
}
